﻿using Kendo.Mvc.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TS2015.Models;
using Kendo.Mvc.Extensions; // Chú ý thêm thư viện này
using System.Data.Entity;
using System.Net;

namespace TS2015.Areas.Admin.Controllers
{
    public class HomeController : Controller
    {
        // Tạo 1 đối tượng 
        TS2015Context db = new TS2015Context();
      
        // GET: /Admin/Home/

        public ActionResult Index()
        {
            if (Session["Function"] == null)
            {               
                return RedirectToAction("Login");
            }

            if (!CheckRole.IsRole("admin_home", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này."); ;

            ViewBag.LuongTruyCap = db.TbThongKes.First().LuongTruyCap;
            ViewBag.TongHoSo = db.TbThiSinhs.Count();
            ViewBag.LuongHoSo = db.TbThiSinhs.AsEnumerable().Where(e => e.NgayDangKi.Date.ToString("dd/MM/yyyy") == DateTime.Now.ToString("dd/MM/yyyy")).Count();

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
   
        // Hàm lấy dữ liệu khi phân trang
        public ActionResult EditingPopup_Read([DataSourceRequest] DataSourceRequest request)
        {
            // Chỉ cần đổi tên bảng cần lấy dữ liệu (TbHeDaoTaos) 
            return Json(db.TbHeDaoTaos.ToDataSourceResult(request));
        }
     
        //        

        // Hàm thêm mới dữ liệu khi bấm nút thêm (Phương thức POST)
        [HttpPost]
        public ActionResult EditingPopup_Create([DataSourceRequest] DataSourceRequest request,/* Đổi tên bảng TbHeDaoTao*/ TbHeDaoTao data)
        {
            if (data != null && ModelState.IsValid)
            {
                /*Đổi tên bảng TbHeDaoTaos*/
                db.TbHeDaoTaos.Add(data);
                db.SaveChanges();
            }

            return Json(ModelState.ToDataSourceResult());
        }

        // Hàm cập nhật dữ liệu (Phương thức POST)
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EditingPopup_Update([DataSourceRequest] DataSourceRequest request,/* Đổi tên bảng TbHeDaoTao*/ TbHeDaoTao data)
        {
            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }

            return Json(ModelState.ToDataSourceResult());
        }

        // Hàm xóa dữ liệu (Phương thức POST)
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult EditingPopup_Destroy([DataSourceRequest] DataSourceRequest request,/* Đổi tên bảng TbHeDaoTao*/ TbHeDaoTao data)
        {
            if (data != null)
            {
                /* Đổi tên bảng TbHeDaoTao và Khóa*/
                TbHeDaoTao itemdata = db.TbHeDaoTaos.First(item => item.MaHeDaoTao == data.MaHeDaoTao);
                db.TbHeDaoTaos.Remove(itemdata);
                db.SaveChanges();
            }

            return Json(ModelState.ToDataSourceResult());
        }

        public ActionResult Details(int id)
        {
            return View();
        }
 
        public ActionResult Login()
        {
            HttpCookie ckMatKhau = Request.Cookies["Ad_MatKhau"];
            HttpCookie ckTenDangNhap = Request.Cookies["Ad_TenDangNhap"];
            if (ckTenDangNhap != null)
            {
                if (CheckLogin(ckTenDangNhap.Value, ckMatKhau.Value, true))
                    return RedirectToRoute("Admin", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
            }
            return View();
        }

        bool CheckLogin(string TenDangNhap, string MatKhau, bool remember = false)
        {
            if (TenDangNhap != null && MatKhau != null)
            {
                string MatKhauMd5 = DuLieuChung.MaHoaMD5(MatKhau);

                var users = (from p in db.TbNguoiDungs
                             where p.TenDangNhap == TenDangNhap && p.MatKhau == MatKhauMd5
                             select p
                            );

                if (users.Count() == 0)
                {
                    ModelState.AddModelError("Error", "Tên đăng nhập hoặc mật khẩu không đúng.");
                    return false;
                }

                if (users.First().KhoaTaiKhoan == KhoaTaiKhoan.Khoa)
                {
                    ModelState.AddModelError("Error", "Tài khoản của bạn bị khóa.");
                    return false;
                }
                var name = from a in users
                           join b in db.TbQuyens on a.MaQuyen equals b.MaQuyen
                           select b.Quyen;
                if (name.First().ToLower().Trim() == "thí sinh")
                    return false;

                if (remember)
                {
                    // check if cookie exists and if yes update
                    HttpCookie ckTenDangNhap = Request.Cookies["Ad_TenDangNhap"];

                    if (ckTenDangNhap != null)
                    {
                        //force to expire it
                        ckTenDangNhap.Values.Add("Ad_TenDangNhap", users.First().TenDangNhap);
                        ckTenDangNhap.Values.Add("Ad_MatKhau", MatKhau);
                        //ckTenDangNhap.Values.Add("Roles", users.First().MaQuyen.ToString());
                        ckTenDangNhap.Expires = DateTime.Now.AddHours(-20);
                    }
                    HttpCookie ckMatKhau = null;

                    //create a cookie
                    ckTenDangNhap = new HttpCookie("Ad_TenDangNhap");
                    ckMatKhau = new HttpCookie("Ad_MatKhau");

                    ckTenDangNhap.Value = TenDangNhap;
                    ckMatKhau.Value = MatKhau;

                    ckTenDangNhap.Expires = DateTime.Today.AddDays(15);
                    ckMatKhau.Expires = DateTime.Today.AddDays(15);

                    Response.Cookies.Add(ckTenDangNhap);
                    Response.Cookies.Add(ckMatKhau);
                }

                Session["Ad_TenDangNhap"] = users.First().TenDangNhap;
                Session["Roles"] = db.TbChucNang_Quyen.Where(m => m.MaQuyen == users.FirstOrDefault().MaQuyen).Select(m => m.TbChucNang.MaCN).ToArray();
                Session["Function"] = db.TbChucNang_Quyen.Where(m => m.MaQuyen == users.FirstOrDefault().MaQuyen).Select(m => m.TbChucNang.TenTat.Trim()).ToArray();
                return true;
            }
            return false;
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Login(string TenDangNhap, string MatKhau, bool remember = false)
        {
            if (ModelState.IsValid && TenDangNhap != null && MatKhau != null)
            {
                if (CheckLogin(TenDangNhap, MatKhau, remember))
                {
                    if (Session["current_url"] != null)
                        return Redirect(Session["current_url"].ToString());
                    return RedirectToRoute("Admin", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
                }
            }
            return View();
        }

        public ActionResult Logout()
        {
            Session["Ad_TenDangNhap"] = null;
            Session["Roles"] = null;

            HttpCookie ckMatKhau = Request.Cookies["Ad_MatKhau"];
            HttpCookie ckTenDangNhap = Request.Cookies["Ad_TenDangNhap"];

            if (ckMatKhau != null)
            {
                ckMatKhau.Expires = DateTime.Now.AddDays(-1);
                Response.Cookies.Add(ckMatKhau);
            }

            if (ckTenDangNhap != null)
            {
                ckTenDangNhap.Expires = DateTime.Now.AddDays(-1);
                Response.Cookies.Add(ckTenDangNhap);
            }
            Session.Clear();
            Session.Abandon();
            Session.RemoveAll();

            return RedirectToAction("Login", "Home");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
